package com.xzx.annotation.config;

import com.xzx.annotation.bean.Person;
import com.xzx.annotation.condition.MyTypeFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;

/**
 * @author xinzhixuan
 * @version V1.0
 * @date 2018/7/14 15:45
 */
// 这个注解等价于一个xml配置文件
@Configuration
@ComponentScan(value = {"com.xzx.annotation"}, includeFilters = {
        /*@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)*/
        @ComponentScan.Filter(type = FilterType.CUSTOM, classes = MyTypeFilter.class)
}, useDefaultFilters = false)
public class MainConfig2 {

    /*
     * 默认是单实例的
     * prototype：多实例的：ioc容器启动并不会去调用方法创建对象放在容器中。
     * 					每次获取的时候才会调用方法创建对象；
     * 	singleton：单实例的（默认值）：ioc容器启动会调用方法创建对象放到ioc容器中。
     * 			以后每次获取就是直接从容器（map.get()）中拿，
     * 	request：同一次请求创建一个实例
     * 	session：同一个session创建一个实例
     *
     * 	懒加载：
     * 	        单实例bean：默认在容器启动的时候创建对象；
     * 	        懒加载：容器启动不创建对象。第一次使用(获取)Bean创建对象，并初始化；
     */
    @Scope("prototype")
    @Lazy
    // 这个标签等价一个bean标签， 返回值是class，方法名是bean的id
    @Bean
    public Person person() {
        return new Person("张三", 20);
    }
}
